Additionally simplify operations on them in a few cases.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
printk("Enabling APIC mode: Flat. Using %d I/O APICs\n", nr_ioapics);
}
-cpumask_t target_cpus_flat(void)
+const cpumask_t *target_cpus_flat(void)
{
- return cpu_online_map;
+ return &cpu_online_map;
}
-cpumask_t vector_allocation_cpumask_flat(int cpu)
+const cpumask_t *vector_allocation_cpumask_flat(int cpu)
{
- return cpu_online_map;
+ return &cpu_online_map;
}
-unsigned int cpu_mask_to_apicid_flat(cpumask_t cpumask)
+unsigned int cpu_mask_to_apicid_flat(const cpumask_t *cpumask)
{
- return cpus_addr(cpumask)[0]&0xFF;
+ return cpus_addr(*cpumask)[0]&0xFF;
}
/*
printk("Enabling APIC mode: Phys. Using %d I/O APICs\n", nr_ioapics);
}
-cpumask_t target_cpus_phys(void)
+const cpumask_t *target_cpus_phys(void)
{
- return cpu_online_map;
+ return &cpu_online_map;
}
-cpumask_t vector_allocation_cpumask_phys(int cpu)
+const cpumask_t *vector_allocation_cpumask_phys(int cpu)
{
- return cpumask_of_cpu(cpu);
+ return cpumask_of(cpu);
}
-unsigned int cpu_mask_to_apicid_phys(cpumask_t cpumask)
+unsigned int cpu_mask_to_apicid_phys(const cpumask_t *cpumask)
{
/* As we are using single CPU as destination, pick only one CPU here */
- return cpu_physical_id(first_cpu(cpumask));
+ return cpu_physical_id(cpumask_first(cpumask));
}
return;
}
-cpumask_t target_cpus_x2apic(void)
+const cpumask_t *target_cpus_x2apic(void)
{
- return cpu_online_map;
+ return &cpu_online_map;
}
-cpumask_t vector_allocation_cpumask_x2apic(int cpu)
+const cpumask_t *vector_allocation_cpumask_x2apic(int cpu)
{
- return cpumask_of_cpu(cpu);
+ return cpumask_of(cpu);
}
-unsigned int cpu_mask_to_apicid_x2apic_phys(cpumask_t cpumask)
+unsigned int cpu_mask_to_apicid_x2apic_phys(const cpumask_t *cpumask)
{
- return cpu_physical_id(first_cpu(cpumask));
+ return cpu_physical_id(cpumask_first(cpumask));
}
-unsigned int cpu_mask_to_apicid_x2apic_cluster(cpumask_t cpumask)
+unsigned int cpu_mask_to_apicid_x2apic_cluster(const cpumask_t *cpumask)
{
- return cpu_2_logical_apicid[first_cpu(cpumask)];
+ return cpu_2_logical_apicid[cpumask_first(cpumask)];
}
static void __send_IPI_mask_x2apic(
struct irq_desc * desc = irq_to_desc(irq);
struct irq_cfg *cfg= desc->chip_data;
- dest = set_desc_affinity(desc, mask);
+ dest = set_desc_affinity(desc, &mask);
if (dest == BAD_APICID)
return;
send_cleanup_vector(cfg);
}
-unsigned int set_desc_affinity(struct irq_desc *desc, cpumask_t mask)
+unsigned int set_desc_affinity(struct irq_desc *desc, const cpumask_t *mask)
{
struct irq_cfg *cfg;
unsigned int irq;
unsigned long flags;
cpumask_t dest_mask;
- if (!cpus_intersects(mask, cpu_online_map))
+ if (!cpus_intersects(*mask, cpu_online_map))
return BAD_APICID;
irq = desc->irq;
if (ret < 0)
return BAD_APICID;
- cpus_copy(desc->affinity, mask);
- cpus_and(dest_mask, desc->affinity, cfg->cpu_mask);
+ cpus_copy(desc->affinity, *mask);
+ cpus_and(dest_mask, *mask, cfg->cpu_mask);
- return cpu_mask_to_apicid(dest_mask);
+ return cpu_mask_to_apicid(&dest_mask);
}
static void
-set_ioapic_affinity_irq_desc(struct irq_desc *desc,
- const struct cpumask mask)
+set_ioapic_affinity_irq_desc(struct irq_desc *desc, const cpumask_t *mask)
{
unsigned long flags;
unsigned int dest;
desc = irq_to_desc(irq);
- set_ioapic_affinity_irq_desc(desc, mask);
+ set_ioapic_affinity_irq_desc(desc, &mask);
}
#endif /* CONFIG_SMP */
}
cfg = irq_cfg(irq);
SET_DEST(entry.dest.dest32, entry.dest.logical.logical_dest,
- cpu_mask_to_apicid(cfg->cpu_mask));
+ cpu_mask_to_apicid(&cfg->cpu_mask));
spin_lock_irqsave(&ioapic_lock, flags);
io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
rte.vector = cfg->vector;
SET_DEST(rte.dest.dest32, rte.dest.logical.logical_dest,
- cpu_mask_to_apicid(cfg->cpu_mask));
+ cpu_mask_to_apicid(&cfg->cpu_mask));
io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&rte) + 0));
io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&rte) + 1));
atomic_t irq_err_count;
-int __assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask)
+int __assign_irq_vector(int irq, struct irq_cfg *cfg, const cpumask_t *mask)
{
/*
* NOTE! The local APIC isn't very good at handling
old_vector = irq_to_vector(irq);
if (old_vector) {
- cpus_and(tmp_mask, mask, cpu_online_map);
- cpus_and(tmp_mask, cfg->cpu_mask, tmp_mask);
- if (!cpus_empty(tmp_mask)) {
+ cpus_and(tmp_mask, *mask, cpu_online_map);
+ if (cpus_intersects(tmp_mask, cfg->cpu_mask)) {
cfg->vector = old_vector;
return 0;
}
if ((cfg->move_in_progress) || cfg->move_cleanup_count)
return -EAGAIN;
- /* Only try and allocate irqs on cpus that are present */
- cpus_and(mask, mask, cpu_online_map);
-
err = -ENOSPC;
- for_each_cpu_mask(cpu, mask) {
+ for_each_cpu_mask(cpu, *mask) {
int new_cpu;
int vector, offset;
- tmp_mask = vector_allocation_cpumask(cpu);
- cpus_and(tmp_mask, tmp_mask, cpu_online_map);
+ /* Only try and allocate irqs on cpus that are present. */
+ if (!cpu_online(cpu))
+ continue;
+
+ cpus_and(tmp_mask, *vector_allocation_cpumask(cpu), cpu_online_map);
vector = current_vector;
offset = current_offset;
spin_lock(&desc->lock);
affinity = desc->affinity;
- if ( !desc->action || cpus_equal(affinity, cpu_online_map) )
+ if ( !desc->action || cpus_subset(affinity, cpu_online_map) )
{
spin_unlock(&desc->lock);
continue;
}
cpus_and(affinity, affinity, cpu_online_map);
- if ( any_online_cpu(affinity) == NR_CPUS )
+ if ( cpus_empty(affinity) )
{
break_affinity = 1;
affinity = cpu_online_map;
}
if ( vector ) {
-
- dest = cpu_mask_to_apicid(domain);
+ dest = cpu_mask_to_apicid(&domain);
msg->address_hi = MSI_ADDR_BASE_HI;
msg->address_lo =
struct msi_desc *msi_desc = desc->msi_desc;
struct irq_cfg *cfg = desc->chip_data;
- dest = set_desc_affinity(desc, mask);
+ dest = set_desc_affinity(desc, &mask);
if (dest == BAD_APICID || !msi_desc)
return;
u8 dev = PCI_SLOT(iommu->bdf & 0xff);
u8 func = PCI_FUNC(iommu->bdf & 0xff);
- dest = set_desc_affinity(desc, mask);
+ dest = set_desc_affinity(desc, &mask);
if (dest == BAD_APICID){
dprintk(XENLOG_ERR, "Set iommu interrupt affinity error!\n");
return;
struct irq_cfg *cfg = desc->chip_data;
#ifdef CONFIG_X86
- dest = set_desc_affinity(desc, mask);
+ dest = set_desc_affinity(desc, &mask);
if (dest == BAD_APICID){
dprintk(XENLOG_ERR VTDPREFIX, "Set iommu interrupt affinity error!\n");
return;
int int_dest_mode;
void (*init_apic_ldr)(void);
void (*clustered_apic_check)(void);
- cpumask_t (*target_cpus)(void);
- cpumask_t (*vector_allocation_cpumask)(int cpu);
- unsigned int (*cpu_mask_to_apicid)(cpumask_t cpumask);
+ const cpumask_t *(*target_cpus)(void);
+ const cpumask_t *(*vector_allocation_cpumask)(int cpu);
+ unsigned int (*cpu_mask_to_apicid)(const cpumask_t *cpumask);
void (*send_IPI_mask)(const cpumask_t *mask, int vector);
void (*send_IPI_self)(int vector);
};
void init_apic_ldr_flat(void);
void clustered_apic_check_flat(void);
-cpumask_t target_cpus_flat(void);
-unsigned int cpu_mask_to_apicid_flat(cpumask_t cpumask);
+const cpumask_t *target_cpus_flat(void);
+unsigned int cpu_mask_to_apicid_flat(const cpumask_t *cpumask);
void send_IPI_mask_flat(const cpumask_t *mask, int vector);
void send_IPI_self_flat(int vector);
-cpumask_t vector_allocation_cpumask_flat(int cpu);
+const cpumask_t *vector_allocation_cpumask_flat(int cpu);
#define GENAPIC_FLAT \
.int_delivery_mode = dest_LowestPrio, \
.int_dest_mode = 1 /* logical delivery */, \
void init_apic_ldr_x2apic_phys(void);
void init_apic_ldr_x2apic_cluster(void);
void clustered_apic_check_x2apic(void);
-cpumask_t target_cpus_x2apic(void);
-unsigned int cpu_mask_to_apicid_x2apic_phys(cpumask_t cpumask);
-unsigned int cpu_mask_to_apicid_x2apic_cluster(cpumask_t cpumask);
+const cpumask_t *target_cpus_x2apic(void);
+unsigned int cpu_mask_to_apicid_x2apic_phys(const cpumask_t *cpumask);
+unsigned int cpu_mask_to_apicid_x2apic_cluster(const cpumask_t *cpumask);
void send_IPI_mask_x2apic_phys(const cpumask_t *mask, int vector);
void send_IPI_mask_x2apic_cluster(const cpumask_t *mask, int vector);
void send_IPI_self_x2apic(int vector);
-cpumask_t vector_allocation_cpumask_x2apic(int cpu);
+const cpumask_t *vector_allocation_cpumask_x2apic(int cpu);
#define GENAPIC_X2APIC_PHYS \
.int_delivery_mode = dest_Fixed, \
.int_dest_mode = 0 /* physical delivery */, \
void init_apic_ldr_phys(void);
void clustered_apic_check_phys(void);
-cpumask_t target_cpus_phys(void);
-unsigned int cpu_mask_to_apicid_phys(cpumask_t cpumask);
+const cpumask_t *target_cpus_phys(void);
+unsigned int cpu_mask_to_apicid_phys(const cpumask_t *cpumask);
void send_IPI_mask_phys(const cpumask_t *mask, int vector);
void send_IPI_self_phys(int vector);
-cpumask_t vector_allocation_cpumask_phys(int cpu);
+const cpumask_t *vector_allocation_cpumask_phys(int cpu);
#define GENAPIC_PHYS \
.int_delivery_mode = dest_Fixed, \
.int_dest_mode = 0 /* physical delivery */, \
void move_native_irq(int irq);
void move_masked_irq(int irq);
-int __assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask);
+int __assign_irq_vector(int irq, struct irq_cfg *, const cpumask_t *);
int bind_irq_vector(int irq, int vector, cpumask_t domain);
extern irq_desc_t *domain_spin_lock_irq_desc(
struct domain *d, int irq, unsigned long *pflags);
-static inline void set_native_irq_info(unsigned int irq, cpumask_t mask)
+static inline void set_native_irq_info(unsigned int irq, const cpumask_t *mask)
{
- irq_desc[irq].affinity = mask;
+ irq_desc[irq].affinity = *mask;
}
static inline void set_irq_info(int irq, cpumask_t mask)
{
- set_native_irq_info(irq, mask);
+ set_native_irq_info(irq, &mask);
}
-unsigned int set_desc_affinity(struct irq_desc *desc, cpumask_t mask);
+unsigned int set_desc_affinity(struct irq_desc *, const cpumask_t *);
#endif /* __XEN_IRQ_H__ */